package com.lyy.entity.Util;

import cn.hutool.core.util.StrUtil;
import lombok.SneakyThrows;
import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

import java.util.UUID;

/**
 * @author Liangyaoyun
 */
public class LocalFileUtil {
    /**
     * 将文件上传到本地指定目录中
     *
     * @param multipartFile 文件实例
     * @param dir           文件上传目录
     * @return 本地文件完整路径 + 文件名
     */
    @SneakyThrows
    public static String upload(MultipartFile multipartFile, String dir) {

        if (null == multipartFile || StrUtil.isBlank(dir)) {
            throw new RuntimeException("必要参数为空");
        }

        // 检查目录是否存在，不存在则创建一个返回
        File destDir = new File(dir);
        if (!destDir.exists()) {
            destDir.mkdirs();
        }

        // 获取原始文件名
        String fileName = multipartFile.getOriginalFilename();

        // 生成随机文件名: 由 "UUID后10位 + 当前时间戳 + 原始文件后缀" 组成
        fileName = UUID.randomUUID().toString().substring(26)
                + "-"
                + System.currentTimeMillis()
                + fileName.substring(fileName.lastIndexOf("."));

        // 核心代码: 上传文件到指定的本地位置
        multipartFile.transferTo(new File(destDir, fileName));
        // 返回文件名
        return fileName;
    }

    /**
     * 从本地指定目录中删除指定文件
     *
     * @param fileName 文件名
     * @param dir      文件上传目录
     */
    public static Boolean delete(String fileName, String dir) {
        if (StrUtil.isBlank(fileName) || StrUtil.isBlank(dir)) {
            throw new RuntimeException("必要参数为空");
        }
        File file = new File(dir, fileName);
        return file.exists()?file.delete():false;
    }
    @SneakyThrows
    public static ResponseEntity<byte[]> download( String filename,String dir) {
        // 使用FileUtils工具将文件转成字节数组
        byte[] bytes = FileUtils.readFileToByteArray(new File(dir, filename));
        // 获取响应头
        HttpHeaders headers = new HttpHeaders();
        // 设置以附件形式下载文件，且附件名为avatar的值
        headers.setContentDispositionFormData("attachment", filename);
        // 以8进制流的形式下载附件
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        // HttpStatus.CREATED表示201状态码: 请求已成功且创建了一个新资源并响应回客户端
        return new ResponseEntity<>(bytes, headers, HttpStatus.CREATED);

    }
}
